# ==============类的继承====================
# 类的继承是面向对象程序的一个特点，类可以继承父类的方法，来实现代码重用的目的
# A类继承了B类，A类就是子类或派生类；B类就是父类、基类或超类
# 语法：
#class 子类名(父类名):
#     新的函数

# =======构造方法的特性================
# 1.子类没有写构造方法，子类创建对象时，会调用父类的构造方法
# 2.子类实现了构造方法，子类创建对象时，父类的构造方法不能被调用
# 3.子类

# 1.导包进入类，再调用函数
# import 一次可以导入多个对象
# import animel
from animel import Cat,Child,Parent1,Parent2,Animal,Vector
# met1 = Parent1.met1()


# 2.直接将模块和函数赋给变量
# cat = animel.Cat


cat = Cat()
cat.eat()
cat.run()
cat.catch()
cat.sleep()

try:
    print(cat)
except TypeError:
    print('错误，请检测代码')


# =========多继承============
# 其他的面向对象语言一般不允许多继承，但在python中允许继承多个子类

# 创建多继承子类的对象
child = Child()
child.met2()
try:
    child.met1()
except TypeError:
    print('错误，请检测代码')
else:
    print('这个程序对')
finally:
    print('代码无错误')

# id 方法可以查看对象的id，不同的对象id不同
# 只有两个东西要一样id猜相等，相同属性不能判断
print(id(child))

child2 = Child()
print(id(child2))

child3 = child2
print(id(child3))

print(child3 == child2)
print(child == child2)


# ========对象相等的方法===========
# id（） 只要id相同，指的就是同一个东西
# issubclass(子类，父类) 判断子类是不是另一个类的子类或孙类
# isinstance() 判断类和方法
# print(isinstance(met1, Parent1))
print(issubclass(Cat, Animal))



# ===========方法的的重写==============
# 自定义方法的重写


# 内置方法的重写
# object类有内置方法__str__,这个方法print打印的内容就是str方法的内容


# 加号运算符的重写
v1 = Vector(6,7)
v2 = Vector(6,-7)
print(v1)
print(v2)
print(v2 + v1)